\documentclass[UTF8, a4paper, 10pt]{ctexart}
\usepackage[left=2.50cm, right=2.50cm, top=2.50cm, bottom=2.50cm]{geometry}

% -- text font --
% compile using Xelatex

%\setmainfont{Microsoft YaHei}  % 微软雅黑
%\setmainfont{YouYuan}  % 幼圆
%\setmainfont{NSimSun}  % 新宋体
%\setmainfont{KaiTi}    % 楷体
%\setmainfont{SimSun}   % 宋体
%\setmainfont{SimHei}   % 黑体

\usepackage{times}
%\usepackage{mathpazo}
%\usepackage{fourier}
%\usepackage{charter}
%\usepackage{helvet}

\usepackage{amsmath, amsfonts, amssymb} % math equations, symbols
\usepackage[english]{babel}
\usepackage{color}      % color content
\usepackage{graphicx}   % import figures
\usepackage{url}        % hyperlinks
\usepackage{bm}         % bold type for equations
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{epstopdf}
\usepackage{epsfig}
\usepackage{array}
\usepackage{datetime}
\usepackage{pdfpages}
\usepackage{hyperref}   % bookmarks
\usepackage{longtable}
%=========附录代码==========
\usepackage{listings}       % 代码环境宏包
\usepackage[toc,page,title,titletoc,header]{appendix} % 附录制作宏包
\lstset{% 代码抄录环境的设置
	tabsize=4,%
    frame=lines,%
	basicstyle={\footnotesize\ttfamily},%
    keywordstyle=\bfseries,%
    aboveskip=10pt,%
    belowskip=2pt,%
}
\hypersetup{colorlinks=true,linkcolor=black, citecolor=black, unicode} % unicode
\CTEXsetup[format={\Large\bfseries}]{section} %设置章标题字号为Large，居左
\CTEXsetup[number={\chinese{section}、}]{section}
\CTEXsetup[name={（,）}]{subsection}
\CTEXsetup[number={\chinese{subsection}}]{subsection}
\CTEXsetup[name={（,）}]{subsubsection}
\CTEXsetup[number=\arabic{subsubsection}]{subsubsection}  %以上四行为各级标题样式设置，可根据需要做修改
\renewcommand{\today}{\number\year 年 \number\month 月}  %中文日期
\usepackage{fancyhdr}   % 设置页眉、页脚
%\pagestyle{fancy}
\lhead{\small\leftmark}
\rhead{\small\ 第\thepage\ 页}
%\rhead{\includegraphics[width=10cm][width=1.2cm]{fig/ZJU_BLUE.eps}}
\lfoot{}
\cfoot{}
\rfoot{}

%\usepackage{draftwatermark}         % 所有页加水印
%\usepackage[firstpage]{draftwatermark} % 只有第一页加水印
%\SetWatermarkText{Water-Mark}           % 设置水印内容
%\SetWatermarkText{\includegraphics[width=10cm]{fig/ZJDX-WaterMark.eps}}         % 设置水印logo
%\SetWatermarkLightness{0.9}             % 设置水印透明度 0-1
%\SetWatermarkScale{1}                   % 设置水印大小 0-1

\usepackage{algorithm}
\usepackage{algorithmicx}
\usepackage{algpseudocode}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}  % Use Input in the format of Algorithm
\renewcommand{\algorithmicensure}{ \textbf{Initialize:}} % use Initialize in the format of Algorithm
\renewcommand{\algorithmicreturn}{ \textbf{Output:}}     % use Output in the format of Algorithm



\usepackage{hyperref}   % bookmarks
\hypersetup{colorlinks, bookmarks, unicode} % unicode
\title{\textbf{\Huge{Design a CPU by Yourself}\\\large{——计算机组成原理大作业}}}
\author{ 林泽佳\\学号：2018303059\\班级：14011803 }

\begin{document}
% 图表标题的名称，已经合规不需要再修改
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
% 自动识别的图表文件夹，若使用这些名字命名文件夹，则引用图片路径时只需填文件名即可
\graphicspath{{./}{./img/}{./fig/}{./image/}{./figure/}{./picture/}}
    % \includepdf[pages={1}]{preface.pdf}
    % \thispagestyle{fancy}
    \input{ABSTRACT.tex}
    \thispagestyle{empty}   % 不要页眉页脚和页码
\setcounter{page}{-100} % 此命令仅是为了避免页码重复报错，不要在意

%---------以下生成目录----------
\newpage
\renewcommand{\contentsname}{目录}
\tableofcontents
\thispagestyle{empty}   % 不要页眉页脚和页码
\newpage

%---------以下生成正文----------
% \setlength\parskip{0.8\baselineskip}  % 调整段间距
\setlength{\lineskip}{1.5em}
\setlength{\parskip}{1.2em}
\setcounter{page}{1}    % 从正文开始计页码
\pagestyle{fancy}

\hypertarget{header-n1590}{%
\section{声明}\label{header-n1590}}

\textbf{由于大作业抄袭情况严重，为了防止剽窃并表明真的是自己写的，本作业的一切进度都在仓库中有commit记录，仓库地址：https://gitee.com/zeege/Design-a-CPU-by-yourself}

\hypertarget{header-n1597}{%
\section{指令格式}\label{header-n1597}}

采用双字长指令，指令长度为16位。分析指令集可知：

\begin{itemize}
\item
  操作码位：由于共有8种不同类型的指令，因此考虑采用3bit作为操作码位，分配如下：

  \begin{longtable}[]{@{}cc@{}}
  \toprule
  指令助记符 & 操作码位\tabularnewline
  \midrule
  \endhead
  HLT & 000\tabularnewline
  MOV & 001\tabularnewline
  ADD & 010\tabularnewline
  SUB & 011\tabularnewline
  AND & 100\tabularnewline
  OR & 101\tabularnewline
  NOT & 110\tabularnewline
  JMP & 111\tabularnewline
  \bottomrule
  \end{longtable}

  \textbf{注：}将HLT分配为000，是为了使单操作数的两个指令\texttt{NOT}和\texttt{JMP}的高2位都是0，这样有利于简化硬布线的设计。
\item
  寻址特征位：由于共有4种不同类型的寻址方式，因此考虑采用2bit作为寻址特征位。由于双操作数的指令\textbf{不可能使用相对寻址，只有JMP指令才会使用相对寻址}，而且双操作数指令的两个操作数既可为\texttt{(寄存器编号，主存地址)}，又可为\texttt{（主存地址，寄存器编号）}。因此双操作数的操作码可以隐含地将相对寻址剔除，并可以使用2bit作为寻址特征位。在下面一部分会做详细的讨论。
\item
  操作数：根据寻址特征和操作数类型，分情况决定剩下的11位如何存储操作数，情况如下。
\end{itemize}

\hypertarget{header-n1635}{%
\subsection{双操作数指令}\label{header-n1635}}

对于双操作数指令，由于需求中要求``所有指令的两个操作数不能同时为内存操作数''，并且，双操作数的指令\textbf{不可能使用相对寻址，只有JMP指令才会使用相对寻址}。因此双操作数只有3种寻址方式。然而，由于寄存器编号和主存地址/立即数的次序可以对换，因此应有细分为4种不同的寻址特征。

\begin{itemize}
\item
  格式1：操作数1是寄存器编号，操作数2是主存地址；
\item
  格式2：方式1的镜像，操作数1是主存地址，操作数2是寄存器编号；
\item
  格式3：与第一种类似，将操作数2的主存地址换成了立即数；
\item
  格式4：操作数1和2分别对应2种不同的寄存器编号。
\end{itemize}

虽然理论上应当考虑操作数为\texttt{（主存地址，立即数）}的情况，但由于2个操作数共占用11位，难以为这种情况讨论，因此不予考虑。这种情况可以使用一个寄存器作为中转，使用2条指令来代替（即使用指令类型1+指令类型3）

\begin{quote}
如MOV {[}addr{]} X可以通过：

MOV {[}Ri{]} X

MOV {[}addr{]} {[}Ri{]}

来代替
\end{quote}

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/doubleOP.png}
\caption{双操作数指令格式}
\end{figure}

可以安排寻址特征位如下：

\begin{longtable}[]{@{}cc@{}}
\toprule
操作数类型（dest，sour） & 寻址特征位\tabularnewline
\midrule
\endhead
寄存器直接寻址，直接寻址 & 00\tabularnewline
直接寻址，寄存器直接寻址 & 01\tabularnewline
寄存器，立即寻址 & 10\tabularnewline
寄存器1，寄存器2 & 11\tabularnewline
\bottomrule
\end{longtable}

\hypertarget{header-n1670}{%
\subsection{单操作数指令}\label{header-n1670}}

单操作数指令有\texttt{NOT}和\texttt{JMP}，正好可分为立即寻址、直接寻址、寄存器直接寻址和相对寻址四种寻址方式。由于相对寻址中的操作数也是立即数，在此为了简便，不再对相对寻址来画图。需要注意2点：

\begin{itemize}
\item
  由于\texttt{JMP}指令已经隐含了它必须采用相对寻址，因此\textbf{对于\texttt{JMP}指令而言，寻址特征位无论取什么值，CPU都根据第\texttt{{[}3,10{]}}位的立即数位来与PC相加得到目的地址}。
\item
  \texttt{NOT}指令采用立即寻址方式，没有任何意义！因此\texttt{NOT}指令只有直接寻址和寄存器直接寻址2种寻址方式，在下图种对应指令格式1和3，\texttt{JMP}指令在下图中对应指令格式2
\end{itemize}

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/singleOP.png}
\caption{单操作数指令格式}
\end{figure}

可以安排寻址特征位如下：

\begin{longtable}[]{@{}cc@{}}
\toprule
寻址方式 & 寻址特征位\tabularnewline
\midrule
\endhead
直接寻址 & 00\tabularnewline
相对寻址 & 01\tabularnewline
寄存器直接寻址 & 10\tabularnewline
\bottomrule
\end{longtable}

\hypertarget{header-n1692}{%
\subsection{零操作数指令}\label{header-n1692}}

零操作数指令只有\texttt{HLT}，可以直接安排指令如下。后面是13个1是为了和主存中没有数据的地址做区分。

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/zeroOP.png}
\caption{零操作数指令格式}
\end{figure}

\hypertarget{header-n1695}{%
\subsection{结论}\label{header-n1695}}

为双操作数指令设计了4种指令格式，为单操作数指令设计了3种指令格式，为零操作数指令设计了1种指令格式。

\hypertarget{header-n1697}{%
\section{CPU逻辑框图}\label{header-n1697}}

\hypertarget{header-n1698}{%
\subsection{逻辑设计}\label{header-n1698}}

CPU采用内部总线方式，CPU内部所有的单元都通过一条控制总线和数据总线进行相连。需要注意，除了\texttt{R0\textasciitilde{}R7}寄存器是通用寄存器，对用户可见外，其它寄存器对用户不可见。由于采用的是双子长指令，因此IR是16位寄存器，数据总线宽度也为16。

CPU内部包括：

\begin{itemize}
\item
  CLK脉冲和节拍发生器：产生节拍信号，用于指示CU当前所处的节拍，来供CU产生不同的控制信号
\item
  CU (Control Unit)
  控制单元：负责指令译码，并根据指令在节拍的指示下，在相应的节拍产生不同的控制信号，来控制数据通路的开闭，以此起到控制各个单元的作用
\item
  IR (Instruction Register)
  指令寄存器（\textbf{16位}）：用于存放从内存中取出的指令，并输入到CU中，对用户不可见。IR的地址码部分与MAR之间有直接通路。
\item
  PC (Program Counter)
  程序计数器（8位）：用于存放下一条指令在内存中的地址，对用户不可见
\item
  R\emph{0\textasciitilde{}R}7（8位）：需求中指出的通用寄存器，\textbf{对用户可见}
\item
  MDR（8位）：数据寄存器，用于存放从主存中取出的数据，和待写入主存的数据，对用户不可见
\item
  MAR（8位）：地址寄存器，存放了待访问的主存地址，对用户不可见
\item
  ALU：运算器，用于进行算数和逻辑运算
\end{itemize}

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/logicDesign.png}
\caption{逻辑设计}
\end{figure}

\hypertarget{header-n1719}{%
\subsection{ALU设计}\label{header-n1719}}

74LS181的外特性如图所示，查阅74LS181功能表中涉及\texttt{ADD,\ SUB,\ AND,\ OR,\ NOT}，再与设计的指令集中对应的操作码可知如下对应关系：

\begin{figure}[htbp]
\centering
\includegraphics[width=6cm]{figure/74LS181.png}
\caption{74LS181芯片}
\end{figure}

\begin{longtable}[b]{@{}ccc@{}}
\toprule
操作码 \(P_2P_1P_0\) & \(S_3S_2S_1S_0M\) & 助记符\tabularnewline
\midrule
\endhead
010 & 10010 & ADD\tabularnewline
011 & 01100 & SUB\tabularnewline
100 & 10111 & AND\tabularnewline
101 & 00010 & OR\tabularnewline
110 & 00001 & NOT\tabularnewline
\bottomrule
\end{longtable}

由此可知：

\begin{equation}
    \begin{aligned}
        S_3&=\overline{P_2}P_1\overline{P_0} + P_2\overline{P_1P_0}\\
        S_2&=\overline{P_2}P_1P_0\\
        S_1&=\overline{P_2}P_1P_0 + P_2\overline{P_1P_0}\\
        S_0&=P_2\overline{P_1P_0} + P_2\overline{P_1}P_0\\
        M&=P_2\overline{P_1P_0} + P_2P_1\overline{P_0}\\
    \end{aligned}
\end{equation}


这可以使用一个组合逻辑电路进行实现，十分简单。为了表达更加简练，在图中没有给出该组合逻辑电路的具体实现。

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/ALU.png}
\caption{ALU设计}
\end{figure}

\hypertarget{header-n1752}{%
\section{时序系统和节拍安排}\label{header-n1752}}

无论采用硬布线方式进行设计还是微程序方式进行设计，都要首先确定所采用的时序系统，并划分所有指令的公共微操作，和指令自己独有的微操作后，对此在相应的节拍内设计应当执行的微操作。

需求中要求采用三级时序系统，因此可分为取指令，取有效地址，执行共3个周期，采用定长3级时序系统。同时，由于在安排微操作节拍时，有3个指导原则：

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\item
  有些微操作的次序是不容改变的，因此安排微操作节拍时必须注意微操作的先后顺序
\item
  凡是被控制对象不同的微操作，若能在一个节拍内执行，应尽可能安排在同一个节拍内，以节省时间
\item
  如果有些微操作所占用的时间步长，应该将它们安排在一个节拍内完成，并且允许这些微操作有先后次序
\end{enumerate}

\hypertarget{header-n1762}{%
\subsection{取指周期}\label{header-n1762}}

\textbf{由以下分析讨论可知，取值周期占用第\texttt{{[}T0,\ T2{]}}个节拍}

取指周期需要完成4个指令

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR
PC ← PC + 1
\end{verbatim}

由原则②可知，\texttt{IR\ ←\ MDR,\ PC\ ←\ PC\ +\ 1}这两条微操作可以安排在同一个节拍内执行。因此，取指周期只需要3个节拍，执行的微操作是：

\begin{verbatim}
MAR ← PC

MDR ← M[MAR]

IR ← MDR, PC ← PC + 1
\end{verbatim}

需要注意的是，无论是采用硬布线设计还是微程序设计，CU分析指令的过程都是极其迅速的；对于硬布线而言直接控制了逻辑通路的开闭，对于微程序而言查询微程序入口地址也不需要占用1个节拍；因此可以认为，分析指令的过程是不占用节拍的，可以在\texttt{T2}节拍种，完成\texttt{IR\ ←\ MDR}的微操作后立即分析完毕。

\hypertarget{header-n1769}{%
\subsection{取有效地址周期}\label{header-n1769}}

\textbf{由以下分析讨论可知，取有效地址周期占用第\texttt{{[}T3,\ T4{]}}个节拍}

由于需要访存的寻址方式（如直接寻址）中，需要根据IR中的地址从主存中取回数据存放到MDR中；而对于不需要访存的寻址方式中（如立即寻址、寄存器直接寻址），可以直接从寄存器或IR中的操作数中取得数据；而相对寻址中，则还需要将操作数输入ALU进行运算。因此这里对两种不同的方式进行讨论。经过推演，\textbf{取有效地址周期最多需要2个节拍}，需要注意的是，由于采用定长时序系统，因此对于立即寻址、寄存器直接寻址、相对寻址的指令，需要停等1个节拍；对于直接寻址，不需要停等。

\hypertarget{header-n1772}{%
\paragraph{直接寻址的取有效地址周期}\label{header-n1772}}

\begin{verbatim}
MAR ← IR[3-10]

MDR ← M[MAR]
\end{verbatim}

\hypertarget{header-n1774}{%
\paragraph{立即寻址、寄存器直接寻址的取有效地址周期}\label{header-n1774}}

其中\texttt{sour}根据具体指令的不同，可以是以下3种情况：

\begin{itemize}
\item
  另一个通用寄存器\texttt{Ri}；
\item
  MDR，来准备写入主存；
\item
  ALU，来准备执行运算
\end{itemize}

由于立即寻址和寄存器直接寻址这2种方式执行的微操作相似，只是在IR中所取得操作数不同，因此对立即寻址得方法不再赘述。

\begin{verbatim}
sour ← R[IR[寄存器编号位]]
\end{verbatim}

\hypertarget{header-n1785}{%
\paragraph{3. 相对寻址的取有效地址周期}\label{header-n1785}}

这里\texttt{dest}的含义同上

\begin{verbatim}
ALU ← IR[立即数位]
ALU ← PC
sour ← ALU
\end{verbatim}

由原则②可知，\texttt{ALU\ ←\ IR{[}立即数位{]},\ ALU\ ←\ PC}这两条微操作可以安排在同一个节拍内执行。因此，取指周期只需要2个节拍，执行的微操作是：

\begin{verbatim}
ALU ← IR[立即数位], ALU ← PC
sour
\end{verbatim}

由于认为ALU执行时间短，小于1个节拍，因此总共只需要在一个节拍内执行：

\begin{verbatim}
sour ← IR[立即数位] + PC
\end{verbatim}

\hypertarget{header-n1792}{%
\subsection{执行周期}\label{header-n1792}}

由于采用的是定长时序系统，因此执行周期的长度应由执行最长的指令来决定，在此，对所有指令的执行周期进行讨论。\textbf{由以下分析讨论可知，执行周期占用第\texttt{{[}T5{]}}节拍}。

由于\texttt{sour}和\texttt{dest}已经在取有效地址周期中给出，因此此处使用\texttt{sour}来代表载入的有效地址，即无论是\texttt{M{[}MAR{]},\ R{[}i{]},\ X}，都统一使用\texttt{sour}来指代已经载入的地址的值；

\hypertarget{header-n1795}{%
\paragraph{1. HLT}\label{header-n1795}}

\begin{verbatim}
halt
\end{verbatim}

\hypertarget{header-n1797}{%
\paragraph{2. MOV}\label{header-n1797}}

\begin{itemize}
\item
  对于上面所提到的双操作数指令类型3和4，通用寄存器之间的MOV和立即数到通用寄存器之间的MOV，只需要通过内部总线直接传送即可；

\begin{verbatim}
R[IR[寄存器编号位1]] ← sour
\end{verbatim}
\item
  对于上面所提到的双操作数指令类型1和2，从通用寄存器到主存的MOV和从主存MOV到通用寄存器，需要进行访存操作；由于在取有效地址周期中已经将IR中的地址载入到MAR中，因此此处可以直接使用

\begin{verbatim}
M[MAR] ← sour
\end{verbatim}

  \textbf{需要指出的是，}由于在取有效地址周期中已经讲M{[}MAR{]}载入到MDR中，因此对于指令类型2，从主存MOV到通用寄存器的指令，只需要从MDR读取数据，不需要访存

\begin{verbatim}
sour ← MDR
\end{verbatim}
\end{itemize}

\hypertarget{header-n1807}{%
\paragraph{3. ADD}\label{header-n1807}}

\begin{itemize}
\item
  对于上面所提到的双操作数指令类型3和4，通用寄存器之间的ADD和立即数到寄存器之间的ADD，只需要通过内部总线直接传送即可；

\begin{verbatim}
R[IR[寄存器编号位1]] ← R[IR[寄存器编号位1]] + sour
\end{verbatim}
\item
  对于上面所提到的双操作数指令类型1和2，从通用寄存器到主存的MOV和从主存MOV到通用寄存器，需要进行访存操作；由于在取有效地址周期中已经将IR中的地址载入到MAR中，且已通过访存来讲操作数载入到MDR中，因此此处可以直接使用

\begin{verbatim}
M[MAR] ← MDR + sour
\end{verbatim}
\end{itemize}

\hypertarget{header-n1815}{%
\paragraph{4-7. SUB, AND, OR}\label{header-n1815}}

SUB, AND, OR, NOT和ADD都是同理的，在此不再赘述

\hypertarget{header-n1817}{%
\paragraph{8. JMP}\label{header-n1817}}

\begin{verbatim}
PC ← PC + sour
\end{verbatim}

\hypertarget{header-n1819}{%
\subsection{结论}\label{header-n1819}}

CPU采用定长3级时序系统，取指令周期占用第\texttt{{[}T0,\ T1,\ T2{]}}个节拍，取有效地址周期占用第\texttt{{[}T3,\ T4{]}}个节拍，执行周期占用第\texttt{T5}个节拍

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/pulse.png}
\caption{时序系统}
\end{figure}

\hypertarget{header-n1822}{%
\subsection{完整微操作举例}\label{header-n1822}}

\hypertarget{header-n1823}{%
\subsubsection{以ADD指令举例双操作数指令}\label{header-n1823}}

由于上面的分析过程将3个周期拆解出来进行讨论，略微抽象，在此以ADD指令，举出一个具体的例子，其它双操作数指令，都与ADD指令相似，只需要对执行周期的微操作稍作修改。在此，不妨先回顾一下在前文提到的双操作数的4种不同的寻址方式对应的指令类型：

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/doubleOP.png}
\caption{双操作数指令格式}
\end{figure}

\hypertarget{header-n1826}{%
\paragraph{指令格式 1}\label{header-n1826}}

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1
MAR ← IR[0-7]
MDR ← M[MAR]
R[IR[8-10]] ← R[IR[8-10]] + MDR
\end{verbatim}

\hypertarget{header-n1828}{%
\paragraph{指令格式2}\label{header-n1828}}

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1
MAR ← IR[3-10]
MDR ← M[MAR]
M[MAR] ← MDR + IR[0-2]
\end{verbatim}

\hypertarget{header-n1830}{%
\paragraph{指令格式 3}\label{header-n1830}}

\textbf{注意，}由于指令类型3中，寄存器\texttt{Ri}的值和立即数的值可以通过内部总线直接输送到ALU中，因此在取有效地址周期不需要做任何事情，只需要等待2个节拍。

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1


R[IR[0-2]] ← R[IR[0-2]] + IR[0-7]
\end{verbatim}

\hypertarget{header-n1833}{%
\paragraph{指令格式 4}\label{header-n1833}}

同上，在取有效地址周期不需要做任何事情，只需要等待2个节拍

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1


R[IR[8-10]] ← R[IR[8-10]] + R[IR[5-7]]
\end{verbatim}

\hypertarget{header-n1836}{%
\subsubsection{举例单操作数指令}\label{header-n1836}}

同样的，我们对单操作数的3种不同的寻址方式对应的指令类型进行回顾：

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/singleOP.png}
\caption{单操作数指令格式}
\end{figure}

\hypertarget{header-n1839}{%
\paragraph{指令格式1（NOT指令独有）}\label{header-n1839}}

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1
MAR ← IR[3-10]
MDR ← M[MAR]
M[MAR] ← !IR[3-10]
\end{verbatim}

\hypertarget{header-n1841}{%
\paragraph{指令格式 2（JMP指令独有）}\label{header-n1841}}

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1


PC ← PC + IR[3-10]
\end{verbatim}

\hypertarget{header-n1843}{%
\paragraph{指令格式3（NOT指令独有）}\label{header-n1843}}

\begin{verbatim}
MAR ← PC
MDR ← M[MAR]
IR ← MDR, PC ← PC + 1


R[IR[0-2]] ← !R[IR[0-2]]
\end{verbatim}

\hypertarget{header-n1845}{%
\section{硬布线设计}\label{header-n1845}}

设操作码的3位是\texttt{P2,\ P1,\ P0}，对应指令的第\texttt{15,\ 14,\ 13}位；寻址特征的2位是\texttt{F1,\ F0}，对应指令的第\texttt{12,\ 11}位，剩余的11位操作数分别使用\texttt{A10-A0}表示，分别对应指令的第\texttt{10-0}位。

可知，微操作控制信号的函数表达式：

\[C_n=\sum\limits_{i,j,k}(T_i*P_j*F_k*\sum\limits_mA_m)\]

\hypertarget{header-n1849}{%
\subsection{控制操作数的数据通路}\label{header-n1849}}

具体而言，根据上述讨论的7种指令格式，可以分划分为：

\textbf{注：R为寄存器编号的选线，Ra和Rb是为了区别指向两个不同的寄存器的选线}

\hypertarget{header-n1852}{%
\paragraph{双操作数指令格式1}\label{header-n1852}}

可知：

\begin{itemize}
\item
  \(1=\overline{P_2*P_1}*\overline{F_1}*\overline{F_0}\)
\item
  \(MAR=[A_7,A_0]\)
\item
  \(R=[A_{10},A_8]\)
\end{itemize}

\hypertarget{header-n1861}{%
\paragraph{双操作数指令格式2}\label{header-n1861}}

可知：

\begin{itemize}
\item
  \(1=\overline{P_2*P_1}*F_1*\overline{F_0}\)
\item
  \(MAR=[A_7,A_0]\)
\item
  \(R=[A_{10},A_8]\)
\end{itemize}

\hypertarget{header-n1870}{%
\paragraph{双操作数指令格式3}\label{header-n1870}}

可知：

\begin{itemize}
\item
  \(1=\overline{P_2*P_1}*\overline{F_1}*F_0\)
\item
  \(R=[A_2,A_0]\)
\item
  \(MAR=[A_{10},A_3]\)
\end{itemize}

\hypertarget{header-n1879}{%
\paragraph{双操作数指令格式4}\label{header-n1879}}

可知：

\begin{itemize}
\item
  \(1=\overline{P_2*P_1}*F_1*F_0\)
\item
  \(MAR=[A_7,A_5]\)
\item
  \(R=[A_{10},A_8]\)
\end{itemize}

\hypertarget{header-n1888}{%
\paragraph{单操作数指令格式1}\label{header-n1888}}

可知：

\begin{itemize}
\item
  \(1=P_2*P_1*\overline{F_1}*\overline{F_0}\)
\item
  \(MAR=[A_{10},A_3]\)
\end{itemize}

\hypertarget{header-n1895}{%
\paragraph{单操作数指令格式2}\label{header-n1895}}

可知：

\begin{itemize}
\item
  \(1=P_2*P_1*\overline{F_1}*F_0\)
\item
  \(ALU_{left}=[A_{10},A_3]\)
\item
  \(ALU_{right}=PC\)
\end{itemize}

\hypertarget{header-n1904}{%
\paragraph{单操作数指令格式3}\label{header-n1904}}

可知：

\begin{itemize}
\item
  \(1=P_2*P_1*F_1*\overline{F_0}\)
\item
  \(R=[A_2,A_0]\)
\end{itemize}

\hypertarget{header-n1911}{%
\subsection{从IR低11位到总线的三态门控制}\label{header-n1911}}

由上述分析可知，通过对\(P_2,P_1,P_0,F_1,F_0\)的判断，可以确定指令中低11位的地址的去向。因此可以通过组三态门，来控制数据通路：

\begin{itemize}
\item
  ST4：控制\([A_{10},A_9,A_8]\)
\item
  ST3：控制\([A_7]\)
\item
  ST2：控制\([A_6,A_5]\)
\item
  ST1：控制\([A_4,A_3]\)
\item
  ST0：控制\([A_2,A_0]\)
\end{itemize}

可知指令格式与三态门去向的开闭如下表所示

\begin{longtable}[]{@{}cccccc@{}}
\toprule
指令格式 & ST4 & ST3 & ST2 & ST1 & ST0\tabularnewline
\midrule
\endhead
双操作数指令格式1 & R & MAR & MAR & MAR & MAR\tabularnewline
双操作数指令格式2 & R & MAR & MAR & MAR & MAR\tabularnewline
双操作数指令格式3 & MDR & MDR & MDR & MDR & R\tabularnewline
双操作数指令格式4 & Ra & Rb & Rb & &\tabularnewline
单操作数指令格式1 & MAR & MAR & MAR & MAR &\tabularnewline
单操作数指令格式2 & ALU & ALU & ALU & ALU &\tabularnewline
单操作数指令格式3 & & & & & R\tabularnewline
\bottomrule
\end{longtable}

\textbf{同样的，使用一组合逻辑电路便可以实现上表，在此不再赘述画图}

\hypertarget{header-n1983}{%
\subsection{控制操作码的数据通路}\label{header-n1983}}

在上文的\protect\hyperlink{header-n1719}{ALU设计}中已经指出各个指令与ALU的连线，进行硬布线设计时，只需要根据在不同节拍的微操作，在对应的数据通路上增加一个与节拍一起作为输入的与门，即可起到在对应节拍执行该微操作的效果，如下图，即可实现在\texttt{T2}节拍进行\texttt{PC\ =\ PC+1}的操作。

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/door.png}
\caption{数据通路}
\end{figure}

经过分析可知，除了\texttt{ST4-ST0}对IR与不同寄存器之间的控制外，还需要对以下通路中加上与门，来实现节拍对数据通路的控制，\textbf{注：ALRi中的i是对应每个通用寄存器Ri，因此一共有8个ALRi通路}

\begin{longtable}[]{@{}ccc@{}}
\toprule
节拍 & 通路（终点，起点） & 与门编号\tabularnewline
\midrule
\endhead
T0 & MAR, PC & ARPC\tabularnewline
T1 & MDR, 主存 & MMD\tabularnewline
T2 & ALU, PC & ALPC\tabularnewline
T2 & IR, MDR & IRMD\tabularnewline
T3 & ALU, PC（JMP指令需要） & ALPC\tabularnewline
T5 & ALU, MDR（算数/逻辑运算指令需要） & ALMD\tabularnewline
T5 & 主存, MDR（MOV指令需要） & MMD\tabularnewline
T5 & ALU, Ri（算数/逻辑运算指令需要） & ALRi\tabularnewline
\bottomrule
\end{longtable}

如下图所示，注：省略了\texttt{ST4-ST0}：

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/clock.png}
\caption{加上数据通路控制门的逻辑设计}
\end{figure}

\hypertarget{header-n2026}{%
\section{微程序设计}\label{header-n2026}}

微程序的循环过程可如图所示：

\begin{figure}[htbp]
\centering
\includegraphics[width=10cm]{figure/micro.jpg}
\caption{微程序流程}
\end{figure}

CPU采用水平型微指令进行直接编码，根据硬布线中梳理出的22个数据通路，可知每条微指令中控制15个微操作；由于存在8种指令格式，因此在取有效地址周期需要用到8条不同的微指令进行控制；最后，共有8个机器指令，而每条指令的执行周期都只有一个微操作；公共微操作共3条微指令。综上所述，一共有25条微指令，因此地址空间为\(2^5=32\)，微指令长度为22+5=27。

\textbf{注：1).
由于版面有限，对于不同寄存器Ri与ALU之间的通路的ALRi，仅用一个ALRi来表示，需要注意这代表了ALR0\textasciitilde{}ALR7，2).
地址用16进制表示；3).
\texttt{ADD,SUB,AND,OR}指令都十分相近，因此此处只列举出ADD，其它同理}

\begin{figure}[htbp]
    \centering
    \includegraphics[width=15cm]{microStep.png}
    \caption{微指令}
\end{figure}

\hypertarget{header-n2849}{%
\section{感想与收获}\label{header-n2849}}

在完成这次大作业的过程中不仅收获了很多组成原理的相关知识，还对CPU的内部结构和程序的执行过程有了更加深入的了解。

起初，为了理解该题目的深刻含义，我复习了关于指令系统、CPU
的结构和功能、控制单元的设计等内容。由于书上对于设计的具体步骤和范围并没有给出详细指导，我查找了大量相关资料，初步掌握了设计流程。在指令格式设计过程中，我对书本知识有了更深入的了解，基本可以熟练完成指令格式相关题目。

在 CPU 逻辑结构的设计过程中，我对于计算机功能与结构之间的
相互影响作用有了更深的体会。 我尝试对使用 74181 实现 ALU
的内部结构进行更深入的探索，但由于对一些器件的特性不清楚，只能在文献中大致了解现成的电路逻辑图。未来如果有机会，我将继续学习。

在 CU 的设计过程中，我分别使用了微程序法和硬布线法进行设计，找寻
了多方资料，包括但不限于：中国知网的相关论文、中国大学 MOOC 上的相关课
程。我对步骤的具体操作执行得不够熟练，将会在以后的学习中继续深入研究。




\end{document}